/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.delogic.simuladorbancario.business;

import br.com.delogic.simuladorbancario.model.Cliente;
import br.com.delogic.simuladorbancario.model.ClienteFisico;
import br.com.delogic.simuladorbancario.model.ClienteJuridico;
import br.com.delogic.simuladorbancario.model.SituacaoCliente;
import br.com.delogic.simuladorbancario.model.Sucesso;
import br.com.delogic.simuladorbancario.model.ValidadorDocumentos;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * @author julioVanni
 */
public class ClienteBusiness {
    
    //private final List<Cliente> clientes = new ArrayList<Cliente>();
    
    private final Map<Integer, Cliente> clientes = new HashMap();
    private static ClienteBusiness clienteBusiness;
      
    private ClienteBusiness(){
    
    }
    
    public Sucesso cadastrarCliente(Cliente cliente){
        
        //clientes.add(cliente);
        cliente.setSituacao(SituacaoCliente.ATIVO);
        cliente.setCodigo(clientes.size() + 1);
        clientes.put(cliente.getCodigo(), cliente);
        
        return new Sucesso(String.format("Cliente %s cadastrado com sucesso", cliente.getNomeCompleto()));
       
    }
    
    public Cliente consultarCliente(Integer codigo){
     
        return clientes.get(codigo);
        
        /*for (Cliente c: clientes){
            Cliente cliente = (Cliente) c;

            if (cliente.getCodigo().equals(codigo)){
                return cliente;
            }
         }
        return null; */
        
        /*for(int i = 0; i < clientes.size(); i++){
        
            Cliente cli = (Cliente) clientes.get(i);

            if (cli.getCodigo().equals(codigo)){
                return cli;
            }
         }
        return null;
    } */
        
    }
        
    public static ClienteBusiness getInstance(){
        if (clienteBusiness == null){
           clienteBusiness = new ClienteBusiness();
            return clienteBusiness;
        }
        return clienteBusiness;
    }
    
    public Cliente consultarPorCpf(String cpf){
     
        for (Cliente c: clientes.values()){
            if (c instanceof ClienteFisico && ((ClienteFisico) c).getCpf().equals(cpf)){
                return c;
            }
        }
            
        return null;
                
    }
    
    public Cliente consultarPorCnpj(String cnpj){
        for (Cliente c: clientes.values()){
            if (c instanceof ClienteJuridico && ((ClienteJuridico) c).getCnpj().equals(cnpj)){
                return c;
            }
        }
            
        return null;
    }
    
    public List<Cliente> consultarPorNome(String nome){
        List<Cliente> clientesEcontrados = new ArrayList<>();
        
        for (Cliente c: clientes.values()){
            if (c.getNomeCompleto().toUpperCase().contains(nome.toUpperCase())){
                clientesEcontrados.add(c);
            }
        }
            
        return clientesEcontrados;
    }
    
    public Sucesso alterarCliente(Cliente cliente){
        clientes.put(cliente.getCodigo(), cliente);
        return new Sucesso(String.format("Cliente %s alterado com sucesso", cliente.getNomeCompleto()));
    }
    
    public Sucesso bloquearCliente(Integer codigo){
       clientes.get(codigo).setSituacao(SituacaoCliente.BLOQUEADO);
        return new Sucesso(String.format("Cliente %s bloqueado com sucesso", clientes.get(codigo).getNomeCompleto()));
 
    }
    
    public Sucesso reativarCliente(Integer codigo){
       clientes.get(codigo).setSituacao(SituacaoCliente.ATIVO);
        return new Sucesso(String.format("Cliente %s ativado com sucesso", clientes.get(codigo).getNomeCompleto()));
 
    }
    
     public Sucesso cacelarCliente(Integer codigo){
       clientes.get(codigo).setSituacao(SituacaoCliente.CANCELADO);
        return new Sucesso(String.format("Cliente %s cancelado com sucesso", clientes.get(codigo).getNomeCompleto()));
 
    }
}
    
